<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ECMA测试</title>
  </head>
  <body>
    <script>
      //  1.  Javascript 的数据类型有几种？分别又有哪些类型？（5）
      //  7种 String,Number,Boolean,undefined,null,Symbol,BigInt
      //  2.  return 有那两个作用？ 构造函数里return会怎么样？（5）
      // 终止函数执行,作为函数的返回值
      // 如果return的是基本数据类型,没有影响,如果是空对象,实例对象会接收到一个空对象
      //  3.  undefined 和 null 的区别？什么时候会得到undefined？（5）
      // 一个变量声明了没有赋值就是undefined,null表示为空对象,通常用来初始化对象
      //  4.  使用 continue 或 break 终止循环时，两种方式的区别是？（5）
      // continue是跳出当前循环,break可以结束整个循环
      //  5.  如何判断字符串内是否包含指定字符？（5）
      // 可以用indexOf()来查找字符串,如果没有返回-1   includes()可以用来查找字符串,有返回true,没有返回false
      //  6. 值传递和引用传递的区别？ （5）
      // 值传递是在栈内存中传递的,值传递后修改一个值另一个不会受影响,引用传递是在堆内存进行的,引用传递传递的就是变量的引用地址,引用传递后修改值原来的也会受影响
      //  7. 请尽量列举出数组的方法,并注明其作用以及会不会修改原数组，至少10种（10）
      // foreach()用来遍历数组,不会修改原数组
      // find()查找数组中符合条件的元素,不会修改原数组
      // map()映射数组,返回新数组,不会修改原数组
      // join()把数组转换为字符串,会改变原数组
      // sort()数组排序,会改变原数组
      // reverse()翻转数组,会改变原数组
      // reduce()叠加器,返回新数组,不会改变原数组
      // every()数组中的每一个值都满足条件才返回true,不会改变原数组
      // some()数组中只要有一个满足条件就为真,不会改变原数组
      // concat()合并数组,会返回新数组,不改变原数组
      //  8.  请写出以下输出的结果和原因；（10）
      var bar = true,
        number = 0;
      console.log(bar + 0); // 1 会隐式转换为1
      console.log(bar + 'xyz'); // truexyz  字符串加不是字符串
      console.log(bar + true); //2 隐式转换为1
      console.log(+true); //1 隐式转换1
      console.log(!'bluej'); // false 取反
      console.log(number++); // 1 自增
      console.log(++number); // 2 自增
      console.log(number); // 2 自增完此时为2
      10 > 20 || console.log('haha'); // haha
      10 > 20 && console.log('haha'); // false 有一个为假就为假
      //  9. 将多个数组进合并后再去重；对于去重的方案要求3种及以上（10）
      var arr1 = [1, 2, 3],
        arr2 = [2, 3, 4, 5];
      var arr3 = arr1.concat(arr2);
      console.log(arr3);
      // 1.
      var arr4 = [...new Set(arr3)];
      console.log(arr4);
      // 2.
      var newArr = [];
      for (var k of arr3) {
        newArr[k] ? newArr.pop() : newArr.push(k);
      }
      console.log(newArr);
      //3.
      var newArr4 = [];
      for (var i = 0; i < arr3.length; i++) {
        if (newArr4.indexOf(arr3[i]) === -1) {
          newArr4.push(arr3[i]);
        }
      }
      console.log(newArr4);
      //10.将 str="再见，还会再见吗燕子，再见的时候你要幸福好不好，燕子你要开心，你要幸福，好不好，开心啊，幸福！你的世界以后没有我了，没关系你要幸福，🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊燕子，燕子，燕子，燕子，燕子，燕子，燕子你把我带走吧，燕子！"里面的所有"燕子"替换成"jack"不要用replaceAll(10)
      var str9 =
        '再见，还会再见吗燕子，再见的时候你要幸福好不好，燕子你要开心，你要幸福，好不好，开心啊，幸福！你的世界以后没有我了，没关系你要幸福，🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊燕子，燕子，燕子，燕子，燕子，燕子，燕子你把我带走吧，燕子！';
      for (var i = 0; i < str9.length; i++) {
        if (str9.indexOf('燕子', i) !== -1) {
          str9 = str9.replace('燕子', 'jack');
        }
      }
      console.log(str9);
      //11. 找出数组中年龄小于18岁的女生(girl)的信息重新组成新的数组,并且将她们count变为现有的平方（10）
      var arr3 = [
        { name: '彭于晏', sex: 'boy', age: 18, count: 20 },
        { name: '迪丽热巴', sex: 'girl', age: 17, count: 30 },
        { name: '吴彦祖', sex: 'boy', age: 16, count: 40 },
        { name: '古力娜扎', sex: 'girl', age: 15, count: 50 },
        { name: '刘德华', sex: 'boy', age: 20, count: 60 },
        { name: '刘亦菲', sex: 'girl', age: 13, count: 70 },
        { name: '张学友', sex: 'boy', age: 14, count: 80 },
      ];
      var arr6 = arr3
        .filter(function (item, index) {
          return item.age < 18;
        })
        .map(function (item) {
          return item.count * item.count;
        });
      console.log(arr6);
      // 12. 统计字符串'abbcccddddd'中每个字符出现的次数，统计数组['a','b','b','c','c','c','d','d','d','d','d'中每个字符出现的次数(10分)
      var str5 = 'abbcccddddd';
      var obj = {};
      for (var i = 0; i < str5.length; i++) {
        obj[str5[i]] ? (obj[str5[i]] += 1) : (obj[str5[i]] = 1);
      }
      console.log(obj);

      var arr8 = ['a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd'];
      var arr9 = arr8.reduce(function (prev, item) {
        prev[item] ? (prev[item] += 1) : (prev[item] = 1);
        return prev;
      }, {});
      console.log(arr9);
    </script>
  </body>
</html>
